// 506. 相对名次
// https://leetcode.cn/problems/relative-ranks/
// 简单,给你一个长度为 n 的整数数组 score ，其中 score[i] 
// 是第 i 位运动员在比赛中的得分。所有得分都 互不相同 。
// 运动员将根据得分 决定名次 ，其中名次第 1 的运动员得分最高，
// 名次第 2 的运动员得分第 2 高，依此类推。运动员的名次决定了他们的获奖情况：
// 名次第 1 的运动员获金牌 "Gold Medal" 。
// 名次第 2 的运动员获银牌 "Silver Medal" 。
// 名次第 3 的运动员获铜牌 "Bronze Medal" 。
// 从名次第 4 到第 n 的运动员，只能获得他们的名次编号（即，名次第 x 的运动员获得编号 "x"）。
// 使用长度为 n 的数组 answer 返回获奖，其中 answer[i] 是第 i 位运动员的获奖情况。

#include <bits/stdc++.h>
using namespace std;

class Solution {
  struct Order{
    int score = 0;
    size_t i = 0;
    int no = 0;
  };
public:
  vector<string> findRelativeRanks(vector<int>& score) {
    vector<string> vtPrize = {"Gold Medal",
            "Silver Medal", "Bronze Medal"};
    vector<Order> vtOrd;
    for(size_t i=0; i<score.size(); i++) {
      vtOrd.push_back({score[i], i, 0});
    }
    auto cmp1 = [](Order a, Order b) {return a.score>b.score;};
    sort(vtOrd.begin(),vtOrd.end(),cmp1);
    for(size_t i=0; i<vtOrd.size(); i++) {
      vtOrd[i].no = i+1;
    }
    auto cmp2 = [](Order a, Order b) {return a.i<b.i;};
    sort(vtOrd.begin(), vtOrd.end(), cmp2);
    vector<string> ans;
    for(size_t i=0; i<vtOrd.size(); i++) {
      if(vtOrd[i].no<4){
        ans.push_back(vtPrize[vtOrd[i].no-1]);
      } else {
        ans.push_back(to_string(vtOrd[i].no));
      }
    }
    return ans;
  }
};


int main_rank() {
  vector<int> socre = {10,3,8,9,4};
  Solution().findRelativeRanks(socre);
  return 0;
}
